//
//  NSObject+Model.m
//  03-runtime-简介
//
//  Created by apple on 15/4/6.
//  Copyright (c) 2015年 heima. All rights reserved.
//

#import "NSObject+Model.h"

#import <objc/runtime.h>

//#import "User.h"

@implementation NSObject (Model)

// Class类名：调用类方法都是通过类名调用

+ (instancetype)objectWithDict:(NSDictionary *)dict
{
    
    // 创建对象
    id objc = [[self alloc] init];
    
    
    // 遍历模型里面的所有成员变量
    
    // 获取模型里面所有成员变量 => runtime
    // count:表示类里面有多少个成员变量
    unsigned int count = 0;
    // Class:标示获取哪个类的成员变量列表
    // Ivar *成员变量数组
    // Ivar:成员变量
    Ivar *ivars = class_copyIvarList(self, &count);
    
    for (int i = 0;i < count;i++){
        // 获取成员变量
        Ivar ivar = ivars[i];
        
        // 获取出成员变量属性名
        NSString *name = @(ivar_getName(ivar));
       // NSLog(@"name=====%@",name);
        
        // 获取key => 成员 变量的属性名
        NSString *key = [name substringFromIndex:1];
//         NSLog(@"%@",key);
        // 去字典中获取value
        // key user value dict[@"user"] -> NSDictionary
        id value = dict[key];
        
        if ([value isKindOfClass:[NSDictionary class]]) {
            // 如果取出来的是字典，把字典转模型
            
            // 取出类名
            NSString *type =  @(ivar_getTypeEncoding(ivar));
            // @"@\"User\"
            // User\"
            NSRange range = [type rangeOfString:@"\""];
            type = [type substringFromIndex:range.location + range.length];
            range = [type rangeOfString:@"\""];
            type = [type substringToIndex:range.location];
          
            Class class = NSClassFromString(type);
            NSLog(@"class====%@",class);
            if (class) { // 有类名才需要转换
                
                value = [class objectWithDict:value];
            }
        }

        if (value) { // 字典中有值的时候才需要判断
            // KVC赋值
            [objc setValue:value forKeyPath:key];
        }
        
    }
    
    
    return objc;
    
}

@end
